package swordoffer.offer57_2;

import java.util.ArrayList;
import java.util.List;

public class SlidingWindow {
    public int[][] findContinuousSequence(int target) {
        List<int[]> res = new ArrayList<>();
        // 窗口的左边界与右边界
        int l = 1;
        int r = 1;
        // 窗口中所有数字的和
        int sum = 0;
        // 为什么循环的终止条件为 l > target / 2 ?
        // 由于是连续正整数序列，所以当 l 大于 target/2 时，已经不会再出现和为 target 的数字序列了。
        while (l <= target / 2) {
            if (sum < target) { // 和小于 target 时移动右边界
                sum += r;
                r++;
            } else if (sum > target) {  // 和大于 target 时移动左边界
                sum -= l;
                l++;
            } else {    // 和等于 target 记录答案
                // 窗口中有 r - l 个数字
                int[] temp = new int[r - l];
                // 记录答案
                for (int j = l; j < r; j++) {
                    temp[j - l] = j;
                }
                res.add(temp);
                // 移动左边界前，减去左边界的值
                sum -= l;
                l++;
            }
        }
        return res.toArray(new int[res.size()][]);
    }
}
